#de django
from django.db import models
from django.db.models.query import QuerySet
from django.contrib.auth.models import User

#de python
from datetime import datetime 
import re

#de nuestro proyecto
from lugtrelew.tags.models import TaggedItem
from lugtrelew.middleware import threadlocals


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#               NUESTRAS FUNCIONES (ESTO NO TENDIRA QUE ESTAR ACA)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

def slugify(string):
    string = re.sub('\s+', '_', string)
    string = re.sub('[^\w.-]', '', string)
    return string.strip('_.- ').lower()



#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#                             MANAGERS
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
Un Manager es el interfaz a traves de el cual las operaciones 
de las consultas a la base de datos se proporcionan a los modelos
de Django. Por lo menos un manager existe para cada modelo de 
una aplicacion Django.  
"""

class PostManager(models.Manager):
    ''' El manager del Post, para filtrar los Post que corresponden a un usuario '''
    
    def get_query_set(self):
        rv = QuerySet(self.model)
        user = threadlocals.get_current_user()
        if threadlocals.is_admin_page():
            rv = rv.filter(blog__autor = user)
        return rv


class BlogManager(models.manager.Manager):
    ''' El manager del blog, para filtrar los blog que corresponden a un usuario '''

    def get_query_set(self):
        rv = QuerySet(self.model)
        user = threadlocals.get_current_user()
        if threadlocals.is_admin_page():
            rv = rv.filter(autor = user)
        return rv
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#                             MODELOS
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class Blog(models.Model):
       
    titulo      = models.CharField('Titulo del blog', maxlength=100, unique=True)
    descripcion = models.TextField()
    fecha       = models.DateTimeField(default=datetime.now, editable=False)
    autor       = models.ForeignKey(User, editable=False)
    slug        = models.SlugField(unique = True, editable=False)
    
    objects     = BlogManager()
    
    def __str__(self):
        return self.titulo
    
    def save(self):
        if getattr(self, 'autor_id', None) is None: 
            self.autor_id = threadlocals.get_current_user().id
        self.slug = slugify(self.titulo[:50]) 
        super(Blog, self).save()
      
    def get_absolute_url(self):
        return "/blog/%s/" % (self.slug)
    
    class Admin:
        list_display = ['titulo','fecha','slug']
        list_filter  = ['fecha']
        manager      = BlogManager()

    class Meta:
        ordering = ('-fecha',)
        get_latest_by = 'fecha'




class Post(models.Model):
    
    titulo       = models.CharField(maxlength=50)
    fecha        = models.DateTimeField(default=datetime.now, editable=False)
    slug         = models.SlugField(unique_for_date='fecha', editable=False)
    descripcion  = models.TextField()
    cuerpo       = models.TextField()
    lecturas     = models.IntegerField(default=0, editable=False)
    votos        = models.IntegerField(default=0, editable=False)
    tags_as_text = models.CharField('tags', maxlength=150)
    tags         = models.GenericRelation(TaggedItem)
    enlace       = models.URLField(blank=True, null=True)
    
    blog         = models.ForeignKey(Blog, related_name = 'blog_posts')
 
    def __str__(self):
        " returna el titulo del Post "
        return self.titulo
    
    def save(self):
        self.slug = slugify(self.titulo[:50])
        super(Post, self).save()
        self.actualizar_lista_tags(self.tags_as_text)
    
    def actualizar_lista_tags(self, tags_as_text):
        tag_list = tags_as_text.split(',')
        self.tags.clear()
        for tag in tag_list:
            self.tags.create(slug=slugify(tag))
     
    def post_leido(self):
        self.lecturas+=1
        self.save()
    
    def post_votado(self):
        self.votos+1
        self.save()
    
    def get_absolute_url(self):
        return "/blog/%s/%s/%s/" % (self.blog.slug, self.fecha.strftime("%d/%m/%Y"), self.slug)    
    
    class Admin:
        list_display  = ['titulo', 'fecha','blog']
        list_filter   = ['blog','tags']
        search_fields = ['titulo','descripcion','cuerpo']
        manager       = PostManager()
    
    class Meta:
        ordering = ('-fecha',)
        get_latest_by = 'fecha'

